Service (Effect)
from Effect-TS
特定の機能を凝集したcomponentのこと
実装は隠蔽され、Effect内ではinterfaceを介してアクセスできる
「Service (Effect)は概念」と捉えると良い
Serviceとは具体的にこれ、というのを示しづらい
ServiceのinterfaceはService Type
これはTag (Effect)を生成する際に定義される
Serviceの実体はEffect
Context (Effect)を使って、↑と紐づけられる
Contextを使って実体を流し込む流れ
Managing Services | Effect Documentation
#wip
どういうものをServiceとして定義するの #??
副作用を起こすもの、という理解で良い?
Context (Effect)
Context.Tag.Service<T>
Service Typeを抽出する型
Effect.serviceOption
https://effect.website/docs/requirements-management/services/#optional-services
code:ts
const program = Effect.gen(function* () {
const maybeRandom = yield* Effect.serviceOption(Random)
const randomNumber = Option.isNone(maybeRandom)
? // the service is not available, return a default value
-1
: // the service is available
yield* maybeRandom.value.next
console.log(randomNumber)
})
ないかもしれないService (Effect)を使う時
defaultで入っている5つのServie
https://effect.website/docs/requirements-management/default-services/
code:ts
type DefaultServices = Clock | ConfigProvider | Console | Random | Tracer
例
code:ts
// program :: Effect<void, never, never>
const program = Effect.gen(function* () {
const now = yield* Clock.currentTimeMillis
yield* Console.log(Application started at ${new Date(now)})
})
Effect.runFork(program)
まじかよ、変やろ、お節介すぎるmrsekut.icon
だって型がおかしいやん
上書きもできる
Effect.withClock 特定のサービスを使用してClockエフェクトを実行します。
Effect.withClockScoped Clockサービスを一時的にオーバーライドし、スコープの終了時に復元します。
Effect.withConfigProvider 特定のサービスを使用してConfigProviderエフェクトを実行します。
Effect.withConfigProviderScoped ConfigProviderスコープ内のサービスを一時的にオーバーライドします。
Effect.withConsole 特定のサービスを使用してConsoleエフェクトを実行します。
Effect.withConsoleScoped Consoleスコープ内のサービスを一時的にオーバーライドします。
Effect.withRandom 特定のサービスを使用してRandomエフェクトを実行します。
Effect.withRandomScoped Randomスコープ内のサービスを一時的にオーバーライドします。
Effect.withTracer 特定のサービスを使用してTracerエフェクトを実行します。
Effect.withTracerScoped Tracerスコープ内のサービスを一時的にオーバーライドします。